package com.itmeng.sh.exception;

/*
全局异常处理器
 */

import com.google.common.collect.ImmutableMap;
import com.itmeng.sh.response.Result;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice  //组合注解
public class ExceptionCatch {
    //作用追踪产生此日志的类信息，会在这个日志前面出现打印出这个类
    private static final Logger LOGGER = Logger.getLogger(ExceptionCatch.class);

    @ExceptionHandler(BusinessException.class)  //拦截的是BusinessException
    public Result catchBusinessException(BusinessException ex) {
        //记日志，发短信/邮件   这里可以做很多事情相当于某个生命周期节点
        // 生病了生命周期  每一个生命周期都可以做很多事情
        LOGGER.error(ex);
        ex.printStackTrace();

        return Result.errorResult(ex.getStatusCode());
    }

    /**
     * 下面创建了两个空的ImmuttableMap
     *
     */
    //使用EXCEPTIONS存放异常类型和错误代码的映射 ImmutableMap的特点一旦创建不可改变，并线程安全
    private static ImmutableMap<Class<? extends Throwable>,Result> EXCEPTIONS;
    //使用builder来构建一个异常类型和错误代码的异常
    protected static  ImmutableMap.Builder<Class<? extends Throwable>,Result> builder=ImmutableMap.builder();

    @ExceptionHandler(Exception.class) //拦截的是Exception 不可预知异常
    public  Result catchException(Exception ex){
        //记录日志，发短信/邮件
        LOGGER.error(ex);
     return  null;
    }
}
